import * as svgCaptcha from 'svg-captcha';
import { getRedisClient } from '../database/redis';
import { utils } from './utils';

// 验证码过期时间：5分钟
const CAPTCHA_EXPIRE = 300;

/**
 * 生成验证码
 * @returns 返回验证码ID和SVG图片
 */
export async function generateCaptcha(): Promise<{ id: string; svg: string }> {
  // 生成验证码
  const captcha = svgCaptcha.create({
    size: 4, // 验证码长度
    ignoreChars: '0o1il', // 忽略容易混淆的字符
    noise: 2, // 干扰线条数
    color: true, // 彩色
    background: '#f0f0f0', // 背景色
    width: 120,
    height: 40,
  });

  // 生成验证码ID
  const captchaId = utils.generateUUID();

  // 将验证码答案存储到Redis（小写，忽略大小写）
  const redis = getRedisClient();
  await redis.setex(
    `captcha:${captchaId}`,
    CAPTCHA_EXPIRE,
    captcha.text.toLowerCase()
  );

  return {
    id: captchaId,
    svg: captcha.data,
  };
}

/**
 * 验证验证码
 * @param captchaId 验证码ID
 * @param captchaText 用户输入的验证码
 * @returns 验证是否通过
 */
export async function verifyCaptcha(captchaId: string, captchaText: string): Promise<boolean> {
  if (!captchaId || !captchaText) {
    return false;
  }

  const redis = getRedisClient();
  const key = `captcha:${captchaId}`;
  
  // 从Redis获取验证码答案
  const storedCaptcha = await redis.get(key);
  
  if (!storedCaptcha) {
    // 验证码不存在或已过期
    return false;
  }

  // 比较验证码（忽略大小写）
  const isValid = storedCaptcha.toLowerCase() === captchaText.toLowerCase();

  // 验证后删除验证码（一次性使用）
  if (isValid) {
    await redis.del(key);
  }

  return isValid;
}

